// Package main 实现了一个流式gRPC客户端，用于演示gRPC流式传输的使用
package main

import (
	"bufio"
	"context"
	"fmt"
	"grpc_study/stream_proto/proto"
	"io"
	"log"
	"os"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

// main 函数是程序的入口点，负责创建gRPC客户端并调用流式服务
func main() {
	// 定义服务器地址
	addr := ":8080"

	// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。
	// 此处使用不安全的证书来实现 SSL/TLS 连接
	conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))
	}

	// 确保在函数结束时关闭连接
	defer conn.Close()

	// 初始化流式服务客户端
	client := proto.NewServiceStreamClient(conn)

	// // 调用Fun方法并接收流式响应（注释掉的代码示例）
	// stream, err := client.Fun(context.Background(), &proto.Request{
	// 	Name: "张三",
	// })
	// // 循环接收服务端发送的数据
	// for {
	// 	response, err := stream.Recv()
	// 	// 如果接收到EOF，表示服务端已发送完所有数据
	// 	if err == io.EOF {
	// 		break
	// 	}
	// 	// 打印接收到的响应数据
	// 	fmt.Println(response)
	// }

	// 调用DownLoadFile方法下载文件
	stream, err := client.DownLoadFile(context.Background(), &proto.Request{
		Name: "张三",
	})

	// 创建本地文件用于保存下载的内容
	file, err := os.OpenFile("static/1.gvb_web项目搭建1.mp4", os.O_CREATE|os.O_WRONLY, 0600)
	if err != nil {
		log.Fatalln(err)
	}

	// 确保在函数结束时关闭文件
	defer file.Close()

	// 创建带缓冲的写入器以提高写入效率
	writer := bufio.NewWriter(file)

	// 记录写入次数的变量
	var index int

	// 循环接收服务端发送的文件数据块
	for {
		index++

		// 接收服务端发送的文件数据块
		response, err := stream.Recv()

		// 如果接收到EOF，表示文件已传输完成
		if err == io.EOF {
			break
		}

		// 打印本次写入的信息
		fmt.Printf("第%d 次， 写入 %d 数据\n", index, len(response.Content))

		// 将接收到的数据写入文件
		writer.Write(response.Content)
	}

	// 刷新缓冲区，确保所有数据都写入文件
	writer.Flush()
}
